var express = require("express");
var router = express.Router();

const { Setting } = require("../../models");
const { NotFound } = require("http-errors");
const { success, failure } = require("../../utils/responses");
const { delKey, flushAll } = require("../../utils/redis");

/**
 * 获取系统设置详情
 * GET /admin/settings
 * @return 系统设置详情
 */
router.get("/", async function (req, res, next) {
  // 处理异常 try catch
  try {
    const setting = await getSetting();
    // 成功状态码 默认200
    success(res, "查询系统设置详情成功", { setting });
  } catch (error) {
    failure(res, error);
  }
});

/**
 * 更新系统设置
 * PUT /admin/settings
 * @params id 系统设置id
 * @body title 标题
 * @body content 内容
 * @return 系统设置详情
 */
router.put("/", async function (req, res, next) {
  // 处理异常 try catch
  try {
    const setting = await getSetting();
    // 白名单过滤
    const body = filterBody(req);

    await setting.update(body);

    // 更新后，删除redis缓存
    await delKey("setting");

    success(res, "更新系统设置成功", { setting });
  } catch (error) {
    failure(res, error);
  }
});

/**
 * 公共方法: 查询当前系统设置
 */
async function getSetting() {
  // 查询系统设置
  // const setting = await Setting.findOne({ where: { id: 1 } });
  // const setting = await Setting.findByPk(1);
  const setting = await Setting.findOne(); // 默认查询第一条 效果同上
  // 系统设置不存在 抛出异常
  if (!setting) {
    throw new NotFound("初始化系统设置不存在, 请先使用种子填充初始化");
  }
  // 系统设置存在
  return setting;
}

/**
 * 白名单过滤
 * @param req
 * @returns {{title, content: (string|*)}}
 */
function filterBody(req) {
  // 只保留白名单字段
  return {
    name: req.body.name,
    icp: req.body.icp,
    copyright: req.body.copyright,
  };
}

/**
 * 清除所有缓存
 */
router.get("/flush-all", async function (req, res) {
  try {
    await flushAll();
    success(res, "清除所有缓存成功。");
  } catch (error) {
    failure(res, error);
  }
});

module.exports = router;
